package PhamVanHien_XML_DEMO;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class Models {
	



	    /***
	     * Nghiệp vụ đọc dữ liệu trong files XML có sẵn
	     * @param lisField - Chứa danh sách các trường dữ liệu. Chỉ số = 0 dành cho Node Atribute Key.
	     * @param elementNode - Phần tử Node con của Root Node. Ví dụ: <iMIC><Student></Student></iMIC> --> Root Node = "iMIC" & Element Node = "Student"
	     * @param path - Chứa đường dẫn resource. Ví dụ: "D:imic/xml/Student.xml"
	     * @return List<List<HashMap<String, String>>>
	     * @throws Exception 
	     */
	    public List<List<HashMap<String, String>>> XMLOfItems(List<Object> lisField, String elementNode, String path)
	            throws Exception {

	        // Khai báo & khởi tạo các đối tượng
	        List<List<HashMap<String, String>>> lisHash = new ArrayList<List<HashMap<String, String>>>();
	        List<HashMap<String, String>> lisTemp = new ArrayList<HashMap<String, String>>();
	        try {
	            // 1. Khởi tạo đối tượng files (tham chiếu tới files)
	            File fXmlFile = new File(path);
	            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
	            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
	            Document doc = null;

	            // 2. Kiểm tra files trước khi bindding dữ liệu trong files XML vào
	            // Documents
	            if (fXmlFile.exists()) {
	                doc = dBuilder.parse(fXmlFile);
	                doc.getDocumentElement().normalize();
	                // 3. Lấy ra danh sách phần tử "Student"
	                NodeList nList = doc.getElementsByTagName(elementNode);

	                // 4. Khai báo và khởi tạo HashMap
	                HashMap<String, String> objHash = null;

	                int iItems = nList.getLength();
	                // 4. Duyệt danh sách phần tử trong nList
	                String key = "";
	                String value = "";
	                for (int j = 0; j < iItems; j++) {
	                    Node nNode = nList.item(j);
	                    if (nNode.getNodeType() == Node.ELEMENT_NODE) {
	                        Element eElement = (Element) nNode;
	                        objHash = new HashMap<String, String>();

	                        for (int k = 0; k < lisField.size(); k++) {
	                            if (k == 0) {
	                                // Identify atribute key - Id
	                                key = "" + lisField.get(k);
	                                value = "" + eElement.getAttribute("" + lisField.get(k));
	                                objHash.put(key, value);
	                            } else {
	                                // Node items in Element Node
	                                key = "" + lisField.get(k);
	                                value = ""
	                                        + eElement.getElementsByTagName("" + lisField.get(k)).item(0).getTextContent();
	                                objHash.put(key, value);
	                            }
	                        }
	                        // 5. Gắn thông tin vào List<HashMap<String, String>>
	                        lisTemp.add(objHash);
	                    }
	                }
	                // 6. Add các List<HashMap<String, String>> vào trong
	                // List<List<HashMap<String, String>>>
	                lisHash.add(lisTemp);
	            } else {
	                return null;
	            }
	        } catch (Exception e) {
	            throw e;
	        }
	        return lisHash;
	    }

}
